package main

import (
	"fmt"
	"math/rand"
	"sort"
)

func newSlice(s [8]int) []int {
	m := make([]int, 0, len(s))
	for i := range s {
		if i < len(s)-1 {
			sum := s[i] + s[i+1]
			m = append(m, sum)
		}
	}
	return m
}

// 随机产生100个整数，数字的范围[-100, 100]
func randNum(j, k int) []int {
	r := make([]int, 0, j)
	for i := 0; i < j; i++ {
		s := rand.Intn(k) - 100
		r = append(r, s)
	}
	return r
}
func main() {

	//1、看下面一段程序，回答问题
	/*
			s1 := make([]int, 3, 4)
			s2 := append(s1, 1)
		    请问s1、s2内各有什么元素？
			s1: [0,0,0]
			s2：[0,0,0,1]
			s1修改一个元素会影响s2吗？s2修改一个元素会影响s1吗？
			s1修改会影响s2，s2修改也会影响s1，因为共用底层数组。
			s2再增加一个元素会怎么样？
			会进行扩容，容量为8
	*/
	fmt.Println("2.一个数组 [1,4,9,16,2,5,10,15]，生成一个新切片，要求新切片元素是数组相邻2项的和。")
	//一个数组 [1,4,9,16,2,5,10,15]，生成一个新切片，要求新切片元素是数组相邻2项的和。
	s := [...]int{1, 4, 9, 16, 2, 5, 10, 15}
	m := newSlice(s)
	fmt.Printf("%+v\n", m)
	fmt.Println("++++++++++++++++++++++++++++++++++++")

	fmt.Println("3.数字重复统计")
	//随机产生100个整数，数字的范围[-100, 100]
	r := make([]int, 0, 100)
	for i := 0; i < 100; i++ {
		s5 := rand.Intn(201) - 100
		r = append(r, s5)
	}
	//r := randNum(100, 201)

	//降序输出这些生成的数字并打印其重复的次数
	f := make([]int, 100)
	copy(f, r)
	//sort.Ints(f)  默认升序
	sort.Sort(sort.Reverse(sort.IntSlice(f)))
	var t = make(map[int]int)
	for _, v := range f {
		if _, ok := t[v]; !ok {
			t[v] = 1
		} else {
			t[v]++
		}
		fmt.Printf("随机生成 %+v, 重复次数 %+v 次\n", v, t[v])
	}

	//4、简述线性数据结构和哈希表优劣
	/*
			线性数据结构
				优势：
					在内存中是连续存储的（特指数组和切片），可以高效地进行内存访问，特别是在访问相邻元素时。
				劣势：
		    		插入和删除：在数组和切片中，如果需要在非末尾位置插入或删除元素，需要移动大量元素，导致操作效率低下。
					链表虽然不需要移动元素，但每个元素都需要单独分配内存，只有定位头和尾快速，访问中间任意元素需要从正向和逆向开始遍历。

			哈希表
				优势：
					map允许存储不同类型的键和值
					哈希表的键和值之间的映射关系，使其查找、插入和删除操作可以快速完成
				劣势：
					输入无限，输出有限，需要额外的空间解决哈希冲突
					map不是并发安全，多个协程，有些协程想写入，有些想读取，并发读写不安全



	*/

}
